package com.hbnu.mysql.User;

import com.hbnu.mysql.Flower.FlowerShop;

import java.sql.*;
import java.util.Map;
import java.util.Scanner;

/*
 * @author zouting
 * @Date 2025-11-05-10:32
 *
 */public class LRService {
    private static final String url = "jdbc:mysql://127.0.0.1:3306/flowerorder?serverTimezone=GMT&useSSL=false";
    private static final String user = "root";
    private static final String pwd = "123456";

    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            while (true) { // 添加主循环这样进行2注册之后可以回到登录页面
                    System.out.println("\n========== 鲜花预定系统 ==========");
                    System.out.println("1. 登录");
                    System.out.println("2. 注册");
                    System.out.print("请选择操作(1-2): ");

                int choice = scanner.nextInt();
                scanner.nextLine(); // 消费换行符

                switch (choice) {
                    case 1:
                        // 登录功能
                        LoginService loginService = new LoginService();
                        Map<String, String> userInfo = loginService.initUI(scanner);//子类中带有scanner参数，这里需要传入参数
                        int loginResult = loginService.verifiedUserInfo(userInfo);
//                     System.out.println(loginResult ? "登录成功" : "登录失败");

                        if (loginResult == LoginService.OK) {

                            //检查是否为管理员
                            if (loginService.isAdmin(userInfo)) {
                                System.out.println("登录成功，欢迎管理员");
                                loginService.adminMenu(scanner);
                                break;
                            } else {
                                System.out.println("登录成功，欢迎用户");
                            }
                            // 2. 进入鲜花商城
                            String username = userInfo.get("username");
                            new FlowerShop(username).enter();
                            break;
                        }
                        while (true) {
                            //先告诉用户失败的原因
                            switch (loginResult) {
                                case LoginService.USER_NOT_EXIST:
                                    System.out.println("用户不存在，请重新输入");
                                    break;
                                case LoginService.WRONG_PASSWORD:
                                    System.out.println("密码错误，请重新输入");
                                    break;
                                default:
                                    System.out.println("未知错误，请重新输入");
                                    break;
                            }

                            System.out.println("请选择操作：");
                            System.out.println("1. 重新登录");
                            System.out.println("2. 注册新用户");
                            System.out.println("3. 退出");
                            System.out.print("请选择(1-3): ");

                            String subchoice = scanner.nextLine().trim();
                            switch (subchoice) {
                                case "1":
                                    // 重新登录
                                    userInfo = loginService.initUI(scanner);
                                    loginResult = loginService.verifiedUserInfo(userInfo);
                                    if (loginResult == LoginService.OK) {
                                        // 登录成功
                                        if (loginService.isAdmin(userInfo)) {
                                            System.out.println("登录成功，欢迎管理员");
                                            loginService.adminMenu(scanner);
                                        } else {
                                            System.out.println("登录成功，欢迎用户");
                                        }
                                        // 进入鲜花商城
                                        String username = userInfo.get("username");
                                        new FlowerShop(username).enter();
                                        return;//结束
                                    }
                                    break;//失败继续while循环
                                case "2":
                                    // 注册功能
                                    RegisterService registerService = new RegisterService();
                                    Map<String, String> registerInfo = registerService.initRegisterUI(scanner);//子类中带有scanner参数，这里需要传入参数
                                    boolean registerResult = registerService.registerUser(registerInfo);
                                    System.out.println(registerResult ? "注册成功" : "注册失败");
                                    if (registerResult) {
                                        // 注册成功后可以自动登录或者返回主菜单
                                        System.out.println("请重新选择登录操作");
                                    }
                                    // 返回主菜单选择
                                    return;
                                case "3":
                                    System.out.println("退出登录");
                                    return;
                                default:
                                    System.out.println("无效选择");
                                    break;
                            }
                        }

                    case 2:
                        // 注册功能
                        RegisterService registerService = new RegisterService();
                        Map<String, String> registerInfo = registerService.initRegisterUI(scanner);//子类中带有scanner参数，这里需要传入参数
                        boolean registerResult = registerService.registerUser(registerInfo);
                        System.out.println(registerResult ? "注册成功" : "注册失败");
                        if (registerResult) {
                            // 注册成功后可以自动登录或者返回主菜单
                            System.out.println("请重新选择登录操作");
                        }
                        // 返回主菜单选择
                        break;
                    case 3:
                        System.out.println("退出程序");
                        return; // 只有选择退出时才结束程序
                    default:
                        System.out.println("无效选择");
                        break;
                }
            }
        }
    }


     /*
     * 初始化用户登录界面，获取用户输入的用户名和密码
     * private static仅能被当前所在类访问，因此下面的方法需要用public可以被任何类访问
     * public成员非静态需要通过类的对象实例调用，public static成员静态方法可以通过类名直接调用,而
     * private static成员无论在类内部还是外部，都只能在类内部通过类名调用，外部不可见
      * */

    public Map<String, String> initUI(Scanner scanner) {
        return null;
    }

    /*
    * 验证用户信息*/
    public int  verifiedUserInfo(Map<String, String> userInfo) {
        return -1;//实现登录验证逻辑
    }

    /*初始化注册界面，获取用户注册信息*/
    public Map<String, String> initRegisterUI(Scanner scanner) {
        return null;//实现注册逻辑
    }
    /*注册新用户*/
    public boolean registerUser(Map<String, String> userInfo) {
        return false;//实现注册逻辑
    }
    /*检查用户名是否已存在*/
    protected static boolean isUsernameExists(String username) {
        String sql = "SELECT COUNT(*) FROM tb_user WHERE username = ?";
        try (Connection connection = getConnection();
             PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            preparedStatement.setString(1, username);
            try (ResultSet resultSet = preparedStatement.executeQuery()) {
                if (resultSet.next()) {
                    return resultSet.getInt(1) > 0;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
    /*获取数据库连接*/
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, pwd);
    }

    // 添加资源关闭方法
    public static void closeResources(Connection conn, PreparedStatement ps, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (ps != null) ps.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}



